import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from db import db

# 关于功能
class AboutFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        tk.Label(self, text='hhhhhhh').pack()
        tk.Label(self, text='hhhhhhh').pack()
        tk.Label(self, text='hhhhhhh').pack()
        tk.Label(self, text='hhhhhhh').pack()

# 修改功能
class ChangetFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)

        self.del_value = None
        # 获取插入的数据变量
        self.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()

        # 页面布局
        tk.Label(self).grid(row=0, column=0)
        # pady是上下边距
        tk.Label(self, text='姓名: ').grid(row=1, column=1, pady=20)
        self.e1 = tk.Entry(self, textvariable=self.name)
        self.e1.grid(row=1, column=2)
        tk.Label(self, text='数学: ').grid(row=2, column=1, pady=20)
        self.e2 = tk.Entry(self, textvariable=self.math)
        self.e2.grid(row=2, column=2)

        tk.Label(self, text='语文: ').grid(row=3, column=1, pady=20)
        self.e3 = tk.Entry(self, textvariable=self.chinese)
        self.e3.grid(row=3, column=2)

        tk.Label(self, text='英语: ').grid(row=4, column=1, pady=20)
        self.e4 = tk.Entry(self, textvariable=self.english)
        self.e4.grid(row=4, column=2)

        tk.Button(self, text='查询', command=self.show_data).grid(row=5, column=1, sticky=tk.E)
        tk.Button(self, text='修改', command=self.modify_data).grid(row=5, column=2, sticky=tk.E)

        # 清空按钮的内容

    def entry_clear(self):
        # entry.delete(0, tk.END)
        self.e1.delete(0, tk.END)
        self.e2.delete(0, tk.END)
        self.e3.delete(0, tk.END)
        self.e4.delete(0, tk.END)

        # 将新插入的内容写入到json文件中

    def modify_data(self):
        self.name = self.e1.get()
        self.math = self.e2.get()
        self.chinese = self.e3.get()
        self.english = self.e4.get()
        if self.name == "" or self.math == "" or self.chinese == "" or self.english == "":
            messagebox.showwarning(title='警告信息', message="信息不完整,修改失败")
            return
        if self.del_value == None:
            messagebox.showwarning(title='提示信息', message="还未进行查询不能修改")
            return
        db.loaded_data.remove(self.del_value)
        self.del_value = None

        t = {'name': self.name, 'math': self.math, 'chinese': self.chinese, 'english': self.english}
        db.json_insert(t)
        self.entry_clear()
        messagebox.showwarning(title='提示信息', message="修改成功")

    def update_entry(self):
        self.e1.insert(0, self.name)
        self.e2.insert(0, self.math)
        self.e3.insert(0, self.chinese)
        self.e4.insert(0, self.english)
    # 查询按钮的功能
    def show_data(self):
        self.name = self.e1.get()
        if self.name == "":
            self.entry_clear()
            messagebox.showwarning(title='警告信息', message="查询数据为空")
            return
        db.show_all_data()
        # 取出要查询人的姓名
        c = self.name
        flag = 0
        # 取出json文件中的数据
        self.d = db.loaded_data
        for i in self.d:
            if i['name'] == c:
                flag = 1
                self.del_value = i
                self.math = i['math']
                self.chinese = i['chinese']
                self.english = i['english']
                self.entry_clear()
                self.update_entry()


        if flag:
            messagebox.showwarning(title='提示', message="查询成功")
        else:
            messagebox.showwarning(title='提示', message="查询失败")


#查询功能
class SelectFrame(tk.Frame):
    # 查询页面的页面显示
    def __init__(self, root):
        super().__init__(root)
        colum_names = ['姓名', '语文', '数学', '英语']
        self.tree_view = ttk.Treeview(self, show= 'headings', columns = colum_names)

        # 设置表头
        for colum in colum_names:
            self.tree_view.heading(column=colum, text=colum)

        self.tree_view.tag_configure('even', background='green')  # 声明奇数行的属性
        self.tree_view.tag_configure('odd', background='white')  # 声明偶数行的属性
        # 设置每列的宽度,列中的内容居中
        self.tree_view.column(column=0, width=140, anchor='center')
        self.tree_view.column(column=1, width=140, anchor='center')
        self.tree_view.column(column=2, width=140, anchor='center')
        self.tree_view.column(column=3, width=140, anchor='center')
        self.tree_view.pack()


        tk.Button(self, text='刷新', command=self.show_data).pack(side='right')

    # 清空表格中的信息
    def show_clear(self):
        for item in self.tree_view.get_children():
            self.tree_view.delete(item)
    # 刷新按钮的功能
    def show_data(self):
        # 每次刷新前先清空一下表格的信息
        self.show_clear()
        #取出学生信息
        db.show_all_data()
        index = 0
        for row in db.loaded_data:
            t = []
            my_tag = 'odd'
            if index % 2 == 0:
                my_tag = 'even'
            for key, value in row.items():
                t.append(value)
            # Treeview中无法拆解字典中的元素,因为字典或元组,是有序的可迭代集合,而字典是一种不可迭代的无序的键值对集合,通过键来访问对应的值，无法像元组和字典那样通过下标迭代访问
            self.tree_view.insert('', "end", values=t, tags=my_tag)
            index += 1



#插入功能
class InsertFrame(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        # self.page = tk.Frame(self)
        # self.page.pack()

        # 获取插入的数据变量
        self.name = tk.StringVar()
        self.math = tk.StringVar()
        self.chinese = tk.StringVar()
        self.english = tk.StringVar()

        #页面布局
        tk.Label(self).grid(row=0, column=0)
        # pady是上下边距
        tk.Label(self, text='姓名: ').grid(row=1, column=1, pady=20)
        self.e1 = tk.Entry(self, textvariable=self.name)
        self.e1.grid(row=1, column=2)
        tk.Label(self, text='数学: ').grid(row=2, column=1, pady=20)
        self.e2 = tk.Entry(self, textvariable=self.math)
        self.e2.grid(row=2, column=2)

        tk.Label(self, text='语文: ').grid(row=3, column=1, pady=20)
        self.e3 = tk.Entry(self, textvariable=self.chinese)
        self.e3.grid(row=3, column=2)

        tk.Label(self, text='英语: ').grid(row=4, column=1, pady=20)
        self.e4 = tk.Entry(self, textvariable=self.english)
        self.e4.grid(row=4, column=2)

        tk.Button(self, text='录入', command=self.insert_data).grid(row=5, column=2, sticky=tk.E)

    # 清空按钮的内容
    def entry_clear(self):
        # entry.delete(0, tk.END)
        self.e1.delete(0, "end")
        self.e2.delete(0, tk.END)
        self.e3.delete(0, tk.END)
        self.e4.delete(0, tk.END)


    # 将新插入的内容写入到json文件中
    def insert_data(self):
        if self.name.get() == "" or self.math.get() == "" or self.chinese.get() == "" or self.english.get() == "":
            messagebox.showwarning(title='警告信息', message="信息不完整,插入失败")
        else:
            db.show_all_data()
            # 讲插入的数据封装成字典
            d = {"name": self.name.get(), "math": self.math.get(), "chinese": self.chinese.get(),
                 "english": self.english.get()}
            # 写入到文件中
            db.json_insert(d)
            # 写入完成后清空文本框数据
            self.entry_clear()
            messagebox.showwarning(title='提示信息', message="插入成功")

# 删除功能
class DelFrame(tk.Frame):
    # 删除页面显示
    def __init__(self, root):
        super().__init__(root)
        # 存储需要删除人的姓名
        self.name = tk.StringVar()

        tk.Label(self, text='指定要删除人的姓名', anchor="center", fg="red").grid(row=1, column=1, pady=20, columnspan=2)
        tk.Label(self, text='姓名: ').grid(row=2, column=1, pady=40)
        self.e1 = tk.Entry(self, textvariable=self.name)
        self.e1.grid(row=2, column=2)

        tk.Button(self, text='删除', command=self.del_data).grid(row=3, column=2, sticky=tk.E)

    # 删除页面的功能
    def del_data(self):
        if self.name.get() == "":
            messagebox.showwarning(title='警告信息', message="删除数据为空")
            return
        # 现将所有的数据取出
        db.show_all_data()
        print(db.loaded_data)
        # 取出要删除人的姓名
        c = self.name.get()
        flag = 0
        # 取出json文件中的数据
        d = db.loaded_data
        for i in d:
            if i['name'] == c:
                flag = 1
                d.remove(i)

        if flag:
            db.json_del(d)
            messagebox.showwarning(title='提示信息', message="删除成功")
        else:
            messagebox.showwarning(title='提示信息', message="删除失败,不存在该学生")
        # 清空文本框
        self.e1.delete(0, "end")








